﻿using QuanLyThuVien.BLL;
using QuanLyThuVien.DTO;
using QuanLyThuVien.Supporter;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace QuanLyThuVien.GUI
{
    public partial class GUIDauSach : DevComponents.DotNetBar.Office2007Form
    {
        private BLLDauSach _bllDauSach;       
        private BLLTheLoai _bllTheLoai;
        private BLLTacGia _bllTacGia;
        private BLLCT_TacGia _bllCT_TacGia;

        private DTODauSach _DauSach;
        private List<DTOTacGia> _DSTacGia;
        private List<DTOTheLoai> _DSTheLoai;
        private THAOTAC _ThaoTac;

        public delegate void XuLySuKienThemDauSach(object sender);
        public event XuLySuKienThemDauSach SuKienThemDauSach;

        //----------------------------------------------------------------------
        //Desc: constructor mặc định
        //----------------------------------------------------------------------
        public GUIDauSach()
        {
            InitializeComponent();

            KhoiTao();
            _ThaoTac = THAOTAC.XEM;
            _DauSach = new DTODauSach();
        }

        //----------------------------------------------------------------------
        //Desc: constructor 1 tham số
        //----------------------------------------------------------------------
        public GUIDauSach(THAOTAC thaotac)
        {
            InitializeComponent();

            KhoiTao();
            _ThaoTac = thaotac;
            _DauSach = new DTODauSach();
        }

        //----------------------------------------------------------------------
        //Desc: constructor 2 tham sốs
        //----------------------------------------------------------------------
        public GUIDauSach(THAOTAC thaotac, DTODauSach dausach)
        {
            InitializeComponent();

            KhoiTao();
            _ThaoTac = thaotac;
            _DauSach = dausach;
        }

        //----------------------------------------------------------------------
        //Desc: khởi tạo
        //----------------------------------------------------------------------
        public void KhoiTao()
        {
            _bllDauSach = new BLLDauSach();
            _bllTheLoai = new BLLTheLoai();
            _bllTacGia = new BLLTacGia();
            _bllCT_TacGia = new BLLCT_TacGia();
            _DSTacGia = new List<DTOTacGia>();
            _DSTheLoai = new List<DTOTheLoai>();
        }

        //----------------------------------------------------------------------
        //Desc: xóa tất cả
        //----------------------------------------------------------------------
        public void XoaTatCa()
        {
            _txtTenDauSach.Text = "";
            try
            {
                _cboTacGia1.SelectedIndex = 0;
                _cboTacGia2.SelectedIndex = 0;
                _cboTacGia3.SelectedIndex = 0;
            }
            catch { }
            if (_DauSach != null)
                _DauSach.Reset();
        }

        //----------------------------------------------------------------------
        //Desc: cập nhật giao diện
        //----------------------------------------------------------------------
        public void CapNhatGiaoDien()
        {
            switch (_ThaoTac)
            { 
                case THAOTAC.THEM:
                    this.Text = "NHẬP ĐẦU SÁCH";
                    _txtTenDauSach.ReadOnly = false;
                    _cboTheLoai.Enabled = true;
                    _cboTacGia1.Enabled = true;
                    _cboTacGia2.Enabled = true;
                    _cboTacGia3.Enabled = true;

                    _btnThem.Visible = true;
                    _btnNhapDS.Visible = true;
                    _btnThemMoi.Visible = true;
                    _btnSua.Visible = false;
                    break;

                case THAOTAC.SUA:
                    this.Text = "CẬP NHẬT ĐẦU SÁCH";
                    _txtTenDauSach.ReadOnly = false;
                    _cboTheLoai.Enabled = true;
                    _cboTacGia1.Enabled = true;
                    _cboTacGia2.Enabled = true;
                    _cboTacGia3.Enabled = true;

                    _btnThem.Visible = false;
                    _btnNhapDS.Visible = false;
                    _btnThemMoi.Visible = true;
                    _btnSua.Visible = true;
                    break;
                case THAOTAC.XEM:
                    this.Text = "THÔNG TIN ĐẦU SÁCH";
                    _txtTenDauSach.ReadOnly = true;
                    _cboTheLoai.Enabled = false;
                    _cboTacGia1.Enabled = false;
                    _cboTacGia2.Enabled = false;
                    _cboTacGia3.Enabled = false;

                    _btnThem.Visible = false;
                    _btnThemMoi.Visible = false;
                    _btnNhapDS.Visible = false;
                    _btnSua.Visible = false;
                    break;
            }
        }

        //----------------------------------------------------------------------
        //Desc: cập nhật nội dung
        //----------------------------------------------------------------------
        public void CapNhatNoiDung()
        {
            switch (_ThaoTac)
            { 
                case THAOTAC.THEM:
                    try
                    {
                        _cboTheLoai.SelectedIndex = 0;
                    }
                    catch { }
                    try
                    {
                        _cboTacGia1.SelectedIndex = 0;
                        _cboTacGia2.SelectedIndex = 0;
                        _cboTacGia3.SelectedIndex = 0;
                    }
                    catch { }
                    break;

                default:
                    HienThiTTDauSach();
                    break;
            }
        }

        //----------------------------------------------------------------------
        //Desc: hiển thị ds thể loại
        //----------------------------------------------------------------------
        public void HienThiDSTheLoai()
        {
            _DSTheLoai = _bllTheLoai.LayDSTheLoai();
            if (_DSTheLoai != null)
            {
                for (int i = 0; i < _DSTheLoai.Count; i++)
                {
                    try
                    {
                        _cboTheLoai.Items.Add(_DSTheLoai[i].TenTheLoai);
                    }
                    catch { }
                }
            }
            else
                MessageBox.Show("Không lấy được danh sách thể loại");

        }

        //----------------------------------------------------------------------
        //Desc: hiển thị ds tác giả
        //----------------------------------------------------------------------
        public void HienThiDSTacGia()
        {
            try
            {
                _cboTacGia1.Items.Add("---Không chọn---");
                _cboTacGia2.Items.Add("---Không chọn---");
                _cboTacGia3.Items.Add("---Không chọn---");
            }
            catch
            { }

            _DSTacGia = _bllTacGia.LayDSTacGia();
            if (_DSTacGia != null)
            {
                for (int i = 0; i < _DSTacGia.Count; i++)
                {
                    try
                    {
                        _cboTacGia1.Items.Add(_DSTacGia[i].TenTG);
                        _cboTacGia2.Items.Add(_DSTacGia[i].TenTG);
                        _cboTacGia3.Items.Add(_DSTacGia[i].TenTG);
                    }
                    catch
                    { }
                }
            }
        }

        //----------------------------------------------------------------------
        //Desc: hiển thị thông tin đầu sách
        //----------------------------------------------------------------------
        public void HienThiTTDauSach()
        {
            if (_DauSach != null)
            {
                _txtTenDauSach.Text = _DauSach.TenDauSach;

                for (int i = 0; i < _DSTheLoai.Count; i++)
                {
                    if (_DauSach.TheLoai.MaTheLoai == _DSTheLoai[i].MaTheLoai)
                    {
                        _cboTheLoai.SelectedIndex = i;
                        break;
                    }
                }

                if (_DauSach.DSCT_TacGia.Count > 0)
                {
                    for (int i = 0; i < _DSTacGia.Count; i++)
                    {
                        if (_DauSach.DSCT_TacGia[0].TacGia.MaTG == _DSTacGia[i].MaTG)
                        {
                            _cboTacGia1.SelectedIndex = i+1;
                            break;
                        }
                    }
                }
                else
                {
                    try
                    {
                        _cboTacGia1.SelectedIndex = 0;
                        _cboTacGia2.SelectedIndex = 0;
                        _cboTacGia3.SelectedIndex = 0;
                    }
                    catch { }
                }

                if (_DauSach.DSCT_TacGia.Count > 1)
                {
                    for (int i = 0; i < _DSTacGia.Count; i++)
                    {
                        if (_DauSach.DSCT_TacGia[1].TacGia.MaTG == _DSTacGia[i].MaTG)
                        {
                            _cboTacGia2.SelectedIndex = i+1;
                            break;
                        }
                    }
                }
                else
                {
                    try
                    {
                        _cboTacGia2.SelectedIndex = 0;
                        _cboTacGia3.SelectedIndex = 0;
                    }
                    catch { }
                }


                if (_DauSach.DSCT_TacGia.Count > 2)
                {
                    for (int i = 0; i < _DSTacGia.Count; i++)
                    {
                        if (_DauSach.DSCT_TacGia[2].TacGia.MaTG == _DSTacGia[i].MaTG)
                        {
                            _cboTacGia3.SelectedIndex = i+1;
                            break;
                        }
                    }
                }
                else
                {
                    try
                    {
                        _cboTacGia3.SelectedIndex = 0;
                    }
                    catch { }
                }
            }
        }

        //----------------------------------------------------------------------
        //Desc: lấy dữ liệu
        //----------------------------------------------------------------------
        public DTODauSach LayDuLieu()
        {
            DTODauSach dausachmoi = new DTODauSach();
            dausachmoi.TenDauSach = _txtTenDauSach.Text;
            dausachmoi.TheLoai.TenTheLoai = _cboTheLoai.Text;
            try
            {
                dausachmoi.TheLoai.MaTheLoai = _DSTheLoai[_cboTheLoai.SelectedIndex].MaTheLoai;
            }
            catch
            {
                MessageBox.Show("Không tìm thấy mã thể loại");
                return null;
            }

            string tentg, matg;
            if (_cboTacGia1.Text != "---Không chọn---")
            {
                tentg = _cboTacGia1.Text;
                try
                {
                    matg = _DSTacGia[_cboTacGia1.SelectedIndex - 1].MaTG;
                }
                catch
                {
                    MessageBox.Show("Không tìm được mã tác giả 1");
                    return null;
                }
                dausachmoi.DSCT_TacGia.Add(new DTOCT_TacGia(new DTOTacGia(matg, tentg)));
            }

            if (_cboTacGia2.Text != "---Không chọn---")
            {
                tentg = _cboTacGia2.Text;
                try
                {
                    matg = _DSTacGia[_cboTacGia2.SelectedIndex - 1].MaTG;
                }
                catch
                {
                    MessageBox.Show("Không tìm được mã tác giả 2");
                    return null;
                }
                if ((dausachmoi.DSCT_TacGia.Count > 0 && matg != dausachmoi.DSCT_TacGia[0].TacGia.MaTG)
                    || dausachmoi.DSCT_TacGia.Count == 0)
                    dausachmoi.DSCT_TacGia.Add(new DTOCT_TacGia(new DTOTacGia(matg, tentg)));
            }

            if (_cboTacGia3.Text != "---Không chọn---")
            {
                tentg = _cboTacGia3.Text;
                try
                {
                    matg = _DSTacGia[_cboTacGia3.SelectedIndex - 1].MaTG;
                }
                catch
                {
                    MessageBox.Show("Không tìm được tác giả 3");
                    return null;
                }
                if ((dausachmoi.DSCT_TacGia.Count > 1 && matg != dausachmoi.DSCT_TacGia[0].TacGia.MaTG
                                                    && matg != dausachmoi.DSCT_TacGia[1].TacGia.MaTG)
                    || (dausachmoi.DSCT_TacGia.Count > 0 && matg != dausachmoi.DSCT_TacGia[0].TacGia.MaTG)
                    || dausachmoi.DSCT_TacGia.Count == 0)
                dausachmoi.DSCT_TacGia.Add(new DTOCT_TacGia(new DTOTacGia(matg, tentg)));
            }

            switch (_ThaoTac)
            { 
                case THAOTAC.THEM:
                    if (!_bllDauSach.PhatSinhMaDauSach(ref dausachmoi))
                    {
                        MessageBox.Show("Không tạo được mã đầu sách mới");
                        return null;
                    }
                    break;
                default:
                    if (_DauSach != null)
                    {
                        dausachmoi.MaDauSach = _DauSach.MaDauSach;
                        for (int i = 0; i < dausachmoi.DSCT_TacGia.Count; i++)
                            dausachmoi.DSCT_TacGia[i].MaDauSach = dausachmoi.MaDauSach;
                    }
                    break;
            }

            return dausachmoi;
        }

        //----------------------------------------------------------------------
        //Desc: sự kiện form load
        //----------------------------------------------------------------------
        private void GUIDauSach_Load(object sender, EventArgs e)
        {
            HienThiDSTheLoai();
            HienThiDSTacGia();
            CapNhatGiaoDien();
            CapNhatNoiDung();
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện blick button Them
        //----------------------------------------------------------------------
        private void btnThem_Click(object sender, EventArgs e)
        {
            DTODauSach dausachmoi = LayDuLieu();
            if (dausachmoi != null)
            {
                if (dausachmoi.DSCT_TacGia.Count == 0)
                    MessageBox.Show("Chưa chọn tác giả");
                else
                {
                    if (_bllDauSach.CapNhat(dausachmoi))
                    {
                        MessageBox.Show("Thêm đầu sách thành công");
                        int dem = 0;
                        for (int i = 0; i < dausachmoi.DSCT_TacGia.Count; i++)
                        {
                            if (_bllCT_TacGia.CapNhat(dausachmoi.DSCT_TacGia[i]))
                                dem++;
                        }
                        _DauSach = dausachmoi;
                        _ThaoTac = THAOTAC.SUA;
                        CapNhatGiaoDien();
                        CapNhatNoiDung();
                        GoiSuKienThem((object)_DauSach);
                    }
                    else
                        MessageBox.Show("Thêm thất bại");
                }
            }
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button Sua
        //----------------------------------------------------------------------
        private void btnSua_Click(object sender, EventArgs e)
        {
            DTODauSach dausachmoi = LayDuLieu();
            if (dausachmoi.DSCT_TacGia.Count == 0)
                MessageBox.Show("Chưa chọn tác giả");
            else
            {
                //thay đổi ở đây
                if (_bllDauSach.CapNhat(dausachmoi))
                {
                    MessageBox.Show("Cập nhật thành công");
                    //xóa tác giả cũ
                    for (int i = 0; i < _DauSach.DSCT_TacGia.Count; i++)
                        _bllCT_TacGia.Xoa(_DauSach.DSCT_TacGia[i]);
                    
                    int dem = 0;
                    //thêm tác giả mới(nếu chưa có)
                    for (int i = 0; i < dausachmoi.DSCT_TacGia.Count; i++)
                    {
                        if (_bllCT_TacGia.DemCTTacGia(dausachmoi.DSCT_TacGia[i]) == 0)
                            if (_bllCT_TacGia.CapNhat(dausachmoi.DSCT_TacGia[i]))
                                dem++;           
                    }
                    _DauSach = dausachmoi;
                }
                else
                    MessageBox.Show("Cập nhật thất bại");
                CapNhatNoiDung();
            }
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button Thoat
        //----------------------------------------------------------------------
        private void btnThoat_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button ThemMoi
        //----------------------------------------------------------------------
        private void btnThemMoi_Click(object sender, EventArgs e)
        {
            XoaTatCa();
            _ThaoTac = THAOTAC.THEM;
            CapNhatGiaoDien();
            CapNhatNoiDung();
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện thêm đầu sách
        //----------------------------------------------------------------------
        public void GoiSuKienThem(object sender)
        {
            if (SuKienThemDauSach != null)
                SuKienThemDauSach(sender);
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click LoadDanhSach
        //----------------------------------------------------------------------
        private void _btnLoadDS_Click(object sender, EventArgs e)
        {
            new GUINhapDSDauSach().Show();
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện key press
        //----------------------------------------------------------------------
        private void Special_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Utils.IsSpecialKey(e.KeyChar))
                e.Handled = true;
            else
                e.Handled = false;
        }

    }
}
